# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
# dst = cv2.Sobel(sec,ddepth,dx,dy,ksize)
# ddepth:图像深度,##深度一般设置为-1，表示输出深度和输入深度一样
# dx和dy：表示水平和竖直方向
# ksize：是Sobel算子大小

def cv_show(img,name,writename):
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
#读取图像
img = cv2.imread('pie.png')
#只有边界位置才会有梯度
#右减左，右为白=255，左为黑=0，所以从原图中，sobelx形成的图为左半边：右减左=白减黑>0,
# 未显示的右半边图为右减左=黑减白<0,不显示原因是opencv对小于0的数做一个截断为0，所以要取绝对值
#左右边界计算和显示
sobelx1 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#写成能表示负数的形式，且dx=1，dy=0表示计算的是水平方向
sobelx2 = cv2.convertScaleAbs(sobelx1)#取绝对值
# res = np.hstack((img, sobelx1,sobelx2))
# cv_show(res,"sobelx",'X-sobelx.png')#X-sobelx为X方向原图，上边界的、和所有边界对比图

#上下边界计算和显示
sobely1 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#
sobely2 = cv2.convertScaleAbs(sobely1)
# res = np.hstack((img, sobely1,sobely2))
# cv_show(res,"sobely",'Y-sobely.png')#Y-sobely为Y方向原图，上边界的、和所有边界对比图

#上下边界的相加
# 分别计算X和Y,再相加
sobelxy = cv2.addWeighted(sobelx2,0.5,sobely2,0.5,0)#相加的系数根据项目修改
# res = np.hstack((sobelx2,sobely2,sobelxy))
# cv_show(res,"direct sobelxy",'direct X+Y.png')#Y-sobely为Y方向原图，上边界的、和所有边界对比图

#直接相加和间接相加对比
sobelxy1 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)#直接计算水平和竖直方向
sobelxy2 = cv2.convertScaleAbs(sobelxy1)
# res = np.hstack((sobelxy,sobelxy2))
# cv_show(res,"indirect sobelxy2",'indirect X+Y.png')#Y-sobely为间接相加、直接相加对比图

#加载彩色图片看看看效果，读入的彩色图像的灰度图,img = cv2.imread('picture.png',0)
#对比原图、直接相加、间接相加
res = np.hstack((img,sobelxy,sobelxy2))
cv_show(res,"colours",'Dispose picture2.png')#原图、间接相加、直接相加对比图

